package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Date;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.PersonaDAO;
import mx.ipn.persistencia.dao.DireccionDAO;
import mx.ipn.to.PersonaTO;
import mx.ipn.to.DireccionTO;
import mx.ipn.to.FechaHoraTO;

public class PersonaDAOMySQL implements PersonaDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(PersonaDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO persona (curp ,nombre,apellido_paterno,apellido_materno,fecha_nacimiento,sexo,telefono,movil,id_direccion) VALUES(?,?,?,?,?,?,?,?,?)";
	private static final String DELETE = "DELETE FROM persona WHERE id_Persona=?";
	private static final String UPDATE = "UPDATE persona SET curp=?,nombre=?,apellido_paterno=?,apellido_materno=?,fecha_nacimiento=?,sexo=?,telefono=?,movil=?,id_direccion=? WHERE id_persona=?";

	private static final String FINDBYID = "SELECT * FROM persona WHERE id_persona=?";
	private static final String SELECT = "SELECT * FROM persona";
	private static final String SELECTBYAPELLIDOPATERNO = "SELECT * FROM persona WHERE apellido_paterno=?";
	private static final String SELECTBYNOMBREAPELLIDOPATERNO = "SELECT * FROM persona WHERE nombre=? AND apellido_paterno=?";
	private static final String SELECTBYTELEFONO = "SELECT * FROM persona WHERE telefono=?";
	private static final String SELECTBYNOMBRE = "SELECT * FROM persona WHERE nombre=?";
	private static final String SELECTBYCURP = "select * from persona where curp=?";
	FabricaDeDAOs fabricaMySQL;

	@Override
	public boolean insertPersona(PersonaTO PersonaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, PersonaTO.getCurp());
			ps.setString(2, PersonaTO.getNombre());
			ps.setString(3, PersonaTO.getApellidoPaterno());
			ps.setString(4, PersonaTO.getApellidoMaterno());
			ps.setDate(5, FechaHoraTO.getFecha(PersonaTO.getFechaNacimiento()));
			ps.setBoolean(6, PersonaTO.isSexo());
			ps.setString(7, PersonaTO.getTelefono());
			ps.setString(8, PersonaTO.getMovil());
			ps.setInt(9, PersonaTO.getDireccionTO().getIdDireccion());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public short deletePersona(int idPersona) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idPersona);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public short updatePersona(PersonaTO PersonaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setString(1, PersonaTO.getCurp());
			ps.setString(2, PersonaTO.getNombre());
			ps.setString(3, PersonaTO.getApellidoPaterno());
			ps.setString(4, PersonaTO.getApellidoMaterno());
			ps.setDate(5, FechaHoraTO.getFecha(PersonaTO.getFechaNacimiento()));
			ps.setBoolean(6, PersonaTO.isSexo());
			ps.setString(7, PersonaTO.getTelefono());
			ps.setString(8, PersonaTO.getMovil());
			ps.setInt(9, PersonaTO.getDireccionTO().getIdDireccion());
			ps.setInt(10, PersonaTO.getIdPersona());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public PersonaTO findPersonaById(int idPersona) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idPersona);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			DireccionDAO edo = fabricaMySQL.getDireccionDAO();
			if (rs.next()) {
				idPersona = rs.getInt("id_persona");
				boolean sexo = rs.getBoolean("sexo");
				String curp = rs.getString("curp");
				String movil = rs.getString("movil");
				String telefono = rs.getString("telefono");
				String nombre = rs.getString("nombre");
				String apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");
				Date fecha_nac = rs.getDate("fecha_nacimiento");
				DireccionTO dirto = edo.findDireccionById(rs
						.getShort("id_direccion"));
				PersonaTO PersonaTO = new PersonaTO(idPersona, curp, nombre,
						apellidoPaterno, apellidoMaterno, fecha_nac, sexo,
						telefono, movil, dirto);

				ps.close();
				conexion.close();
				return PersonaTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<PersonaTO> selectPersonas() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			ArrayList<PersonaTO> coleccion = null;
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			DireccionDAO edo = fabricaMySQL.getDireccionDAO();
			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<PersonaTO>();

				int idPersona = rs.getInt("id_persona");
				boolean sexo = rs.getBoolean("sexo");
				String curp = rs.getString("curp");
				String movil = rs.getString("movil");
				String telefono = rs.getString("telefono");
				String nombre = rs.getString("nombre");
				String apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");
				Date fecha_nac = rs.getDate("fecha_nacimiento");
				DireccionTO dirto = edo.findDireccionById(rs
						.getShort("id_direccion"));
				PersonaTO PersonaTO = new PersonaTO(idPersona, curp, nombre,
						apellidoPaterno, apellidoMaterno, fecha_nac, sexo,
						telefono, movil, dirto);

				coleccion.add(PersonaTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<PersonaTO> selectPersonasByApellidoPaterno(
			String apellidoPaterno) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYAPELLIDOPATERNO);

			ps.setString(1, apellidoPaterno);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			DireccionDAO edo = fabricaMySQL.getDireccionDAO();
			ArrayList<PersonaTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<PersonaTO>();

				int idPersona = rs.getInt("id_persona");
				boolean sexo = rs.getBoolean("sexo");
				String curp = rs.getString("curp");
				String movil = rs.getString("movil");
				String telefono = rs.getString("telefono");
				String nombre = rs.getString("nombre");
				apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");
				Date fecha_nac = rs.getDate("fecha_nacimiento");
				DireccionTO dirto = edo.findDireccionById(rs
						.getShort("id_direccion"));
				PersonaTO PersonaTO = new PersonaTO(idPersona, curp, nombre,
						apellidoPaterno, apellidoMaterno, fecha_nac, sexo,
						telefono, movil, dirto);

				coleccion.add(PersonaTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<PersonaTO> selectPersonasByNombreApellidoPaterno(
			String nombre, String apellidoPaterno) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYNOMBREAPELLIDOPATERNO);

			ps.setString(1, nombre);
			ps.setString(2, apellidoPaterno);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			DireccionDAO edo = fabricaMySQL.getDireccionDAO();
			ArrayList<PersonaTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<PersonaTO>();

				int idPersona = rs.getInt("id_persona");
				boolean sexo = rs.getBoolean("sexo");
				String curp = rs.getString("curp");
				String movil = rs.getString("movil");
				String telefono = rs.getString("telefono");

				String apellidoMaterno = rs.getString("apellido_materno");
				Date fecha_nac = rs.getDate("fecha_nacimiento");
				DireccionTO dirto = edo.findDireccionById(rs
						.getShort("id_direccion"));
				PersonaTO PersonaTO = new PersonaTO(idPersona, curp, nombre,
						apellidoPaterno, apellidoMaterno, fecha_nac, sexo,
						telefono, movil, dirto);

				coleccion.add(PersonaTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}


	@Override
	public ArrayList<PersonaTO> selectPersonasByTelefono(String telefono) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTBYTELEFONO);

			ps.setString(1, telefono);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			DireccionDAO edo = fabricaMySQL.getDireccionDAO();
			ArrayList<PersonaTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<PersonaTO>();

				int idPersona = rs.getInt("id_persona");
				boolean sexo = rs.getBoolean("sexo");
				String curp = rs.getString("curp");
				String movil = rs.getString("movil");
				telefono = rs.getString("telefono");
				String nombre = rs.getString("nombre");
				String apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");
				Date fecha_nac = rs.getDate("fecha_nacimiento");
				DireccionTO dirto = edo.findDireccionById(rs
						.getShort("id_direccion"));
				PersonaTO PersonaTO = new PersonaTO(idPersona, curp, nombre,
						apellidoPaterno, apellidoMaterno, fecha_nac, sexo,
						telefono, movil, dirto);

				coleccion.add(PersonaTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public ArrayList<PersonaTO> selectPersonasByNombre(String nombre) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTBYNOMBRE);

			ps.setString(1, nombre);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			DireccionDAO edo = fabricaMySQL.getDireccionDAO();
			ArrayList<PersonaTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<PersonaTO>();

				int idPersona = rs.getInt("id_persona");
				boolean sexo = rs.getBoolean("sexo");
				String curp = rs.getString("curp");
				String movil = rs.getString("movil");
				String telefono = rs.getString("telefono");
				nombre = rs.getString("nombre");
				String apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");
				Date fecha_nac = rs.getDate("fecha_nacimiento");
				DireccionTO dirto = edo.findDireccionById(rs
						.getShort("id_direccion"));
				PersonaTO PersonaTO = new PersonaTO(idPersona, curp, nombre,
						apellidoPaterno, apellidoMaterno, fecha_nac, sexo,
						telefono, movil, dirto);

				coleccion.add(PersonaTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public ArrayList<PersonaTO> selectPersonasByCURP(String curp) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTBYCURP);

			ps.setString(1, curp);

			ResultSet rs = ps.executeQuery();
			fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			DireccionDAO edo = fabricaMySQL.getDireccionDAO();
			ArrayList<PersonaTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<PersonaTO>();

				int idPersona = rs.getInt("id_persona");
				boolean sexo = rs.getBoolean("sexo");
				curp = rs.getString("curp");
				String movil = rs.getString("movil");
				String telefono = rs.getString("telefono");
				String nombre = rs.getString("nombre");
				String apellidoPaterno = rs.getString("apellido_paterno");
				String apellidoMaterno = rs.getString("apellido_materno");
				Date fecha_nac = rs.getDate("fecha_nacimiento");
				DireccionTO dirto = edo.findDireccionById(rs
						.getShort("id_direccion"));
				PersonaTO PersonaTO = new PersonaTO(idPersona, curp, nombre,
						apellidoPaterno, apellidoMaterno, fecha_nac, sexo,
						telefono, movil, dirto);

				coleccion.add(PersonaTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}
